package data.store;

/*
* 数据存储中枢
* 采用类似分页式内存存储的方式，将加载的数据按行存储到固定大小的字节数组中，
* 数据页中的数据存储是连续的，不同数据页之间采用链表的方式建立连接，具有很强的扩展性。
* 每一个文件读取线程都可以向数据存储中心申请分配两个文件的数据存储空间，
* 数据存储中心负责对分配下去的内存空间进行注册和管理，灵活性好，适用性广。
* */
public class DataWarehouse {

    //两个文件在存储中心的头节点，注册链表中每一个节点表示有一个文件读取线程向存储中心注册申请了一个存储空间
    private static RegisterNode<PartSpace> partRegisterNode = new RegisterNode<>();
    private static RegisterNode<LineItemSpace> lineItemRegisterNode = new RegisterNode<>();

    //两个文件在存储中心的尾节点
    private static RegisterNode<PartSpace> lastPartNode = partRegisterNode;
    private static RegisterNode<LineItemSpace> lastLineItemNode = lineItemRegisterNode;

    //申请分配part文件的存储空间
    public synchronized static PartSpace allocationPartSpace(){
        PartSpace partSpace = new PartSpace();
        RegisterNode<PartSpace> newNode = new RegisterNode<>(partSpace);
        lastPartNode.next = newNode;
        lastPartNode = newNode;
        return partSpace;
    }

    //申请分配lineItem文件的存储空间
    public synchronized static LineItemSpace allocationLineItemSpace(){
        LineItemSpace lineItemSpace = new LineItemSpace();
        RegisterNode<LineItemSpace> newNode = new RegisterNode<>();
        lastLineItemNode.next = newNode;
        lastLineItemNode = newNode;
        return lineItemSpace;
    }

    public static RegisterNode<PartSpace> getFirstPartRegisterNode(){
        return partRegisterNode;
    }

    public static RegisterNode<LineItemSpace> getFirstLineItemRegisterNode(){
        return lineItemRegisterNode;
    }


    //注册节点
    static class RegisterNode<T> {
         T value;//实际的存储空间
         RegisterNode<T> next;//下一个注册节点

         RegisterNode(){
            value = null;
        }
         RegisterNode(T value){
            this.value = value;
        }
    }
}
